package main

import "fmt"

// 大写表示其他包也可访问  类似于java中的static
// 类名  类属性名  类方法名都遵循首字母大写时包外也能访问的规则
type Hero struct {
	// 大写表示其他包也可访问
	Name  string
	Ad    int
	Level string
}

// func后的括号表示绑定到哪个结构体上
// 不带*的表示值拷贝 方法内部是对象的一个副本 没法直接修改原对象的属性
func (hero Hero) Show() {
	fmt.Println("name = ", hero.Name, "Ad = ", hero.Ad, "Level = ", hero.Level)
}

// 带*的表示引用传递 方法内部可以修改对象属性
// 一般对象方法全部带*
func (h *Hero) setName(name string) {
	h.Name = name
}

func (h Hero) setNameWithoutPoint(name string) {
	h.Name = name
}

func (h *Hero) getName() string {
	return h.Name
}

func main10() {
	// 部分属性定义
	hero := Hero{Name: "zhangsan", Ad: 100}
	// 全量属性定义的方式可以这样写
	hero = Hero{"zhangsan", 100, "aa"}
	hero.Show()
	hero.setNameWithoutPoint("lisi")
	hero.Show()
	hero.setName("wangwu")
	hero.Show()
}
